﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BorisTheBlade
{
	public struct OrderData
	{
		public long OrderNo;
		public string BuySell;
		public string MktLimit;
		public string SplitFlag;
		public string ImmCancel;
		public string EntryType;
		public string MarketMaker;
		public string SecBoard;
		public string SecCode;
		public string IssueCode;
		public double Price;
		public int Amount;
		public string ExtRef;

		public OrderData(long orderNo, string buySell, string mktLimit, string splitFlag, string immCancel, string entryType, string marketMaker, string secBoard, string secCode, string issueCode, double price, int amount, string extRef)
		{
			OrderNo = orderNo;
			BuySell = buySell;
			MktLimit = mktLimit;
			SplitFlag = splitFlag;
			ImmCancel = immCancel;
			EntryType = entryType;
			MarketMaker = marketMaker;
			SecBoard = secBoard;
			SecCode = secCode;
			IssueCode = issueCode;
			Price = price;
			Amount = amount;
			ExtRef = extRef;
		}
	}

	/// <summary>
	/// Данные по ордеру
	/// </summary>
	public class OrderDatas
	{
		private List<OrderData> m_Datas;

		public OrderDatas()
		{
			m_Datas = new List<OrderData>();
		}

		/// <summary>
		/// Добавить данные по ордеру.
		/// </summary>
		/// <param name="orderNo">Номер ордера</param>
		/// <param name="buySell">Направление операции: "B" – покупка, "S" – продажа.</param>
		/// <param name="mktLimit">Тип заявки: "M" – рыночная, "L" – лимитированная.</param>
		/// <param name="splitFlag">Признак расщепления цены: "S" – по разным ценам, "O" – по одной цене.</param>
		/// <param name="immCancel">Условие исполнения: " " (пробел) – поставить в очередь, "N" – немедленно или отклонить, "W" – снять остаток.</param>
		/// <param name="entryType">Тип ввода значения цены: "P" – цена, "Y" – доходность, "W" – средневзвешенная цена.</param>
		/// <param name="marketMaker">Признак заявки Маркет-Мейкера: " " (пробел) – обычная заявка, "M" – заявка Маркет-Мейкера.</param>
		/// <param name="secBoard">Код режима торгов для финансового инструмента.</param>
		/// <param name="secCode">Код финансового инструмента.</param>
		/// <param name="issueCode">Код выпуска ценной бумаги.</param>
		/// <param name="price">Цена за одну ценную бумагу.</param>
		/// <param name="amount">Количество ценных бумаг, выраженное в лотах.</param>
		/// <param name="extRef">Внешняя ссылка.</param>
		public void AddData(long orderNo, string buySell, string mktLimit, string splitFlag, string immCancel, string entryType, string marketMaker, string secBoard, string secCode, string issueCode, double price, int amount, string extRef)
		{
			m_Datas.Add(new OrderData(orderNo, buySell, mktLimit, splitFlag, immCancel, entryType, marketMaker, secBoard, secCode, issueCode, price, amount, extRef));
		}

		/// <summary>
		/// Возвращает структуру, содержащую данные о заявке
		/// </summary>
		/// <param name="orderNo">Номер заявки</param>
		/// <returns>Структура типа [OrderData]</returns>
		public OrderData GetData(long orderNo)
		{
			OrderData x = new OrderData();
			for (int i = m_Datas.Count - 1; i >= 0; i--)
			{
				x = m_Datas[i];
				if (x.OrderNo == orderNo)
                    return x;
			}
            throw new Exception(string.Format("Нет данных по ордеру {0} O_o",orderNo.ToString()));
		}
	}
}
